package sf.jsonloader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.HashMap;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

public class JsonLoader {
	private static JsonLoader instance = null;

	public static JsonLoader getInstance() {
		if (instance == null) {
			instance = new JsonLoader();
		}
		return instance;
	}

	// NOTE: ne treba brinuti o sinhronizaciji jer se odavde samo cita.
	private HashMap<String, JSONObject> tables = new HashMap<String, JSONObject>();

	/**
	 * Ucitava metapodatke iz datog json fajla.
	 * 
	 * @param filename
	 * @throws FileNotFoundException
	 */
	public synchronized void load(String filename) throws FileNotFoundException {
		FileReader reader = new FileReader(filename);
		Object obj = JSONValue.parse(reader);
		JSONArray arr = (JSONArray) obj;
		for (Object o : arr) {
			JSONObject jsonObject = (JSONObject) o;
			tables.put((String) jsonObject.get("code"), jsonObject);
		}
	}

	/**
	 * Dohvata trazeni podatak o datoj tabeli.
	 * 
	 * @param table
	 *            Tabela ciji se metapodaci traze
	 * @param what
	 *            Trazeni metapodaci
	 * @return Ako je u pitanju primitivna vrednost, vraca je kao takvu
	 *         (boolean, float, String). Ako je u pitanju objekat, vraca ga kao
	 *         HashMap. Ako je u pitanju niz objekata ili primitivnih vrednosti,
	 *         vraca ArrayList.
	 */
	@SuppressWarnings("unchecked")
	public Object get(String table, String what) {
		return tables.get(table.toUpperCase()).get(what);
	}

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Object obj;
		try {
			obj = JSONValue.parse(new FileReader("C:\\Test_Files\\tst1.txt"));
			JSONArray array = (JSONArray) obj;
			System.out.println(array.get(1));

			// NOTE: kada je JSONObject vraca HashMap, a kada je JSONArray vrce
			// ArrayList
			JSONObject obj2 = (JSONObject) array.get(1);
			System.out.println(obj2.get("1"));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
